package br.urca.helper;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import java.util.TimeZone;

import br.urca.dao.AlunosCursoDAO;
import br.urca.dao.AproveitamentoDAO;
import br.urca.dao.AtividadeAlunoDAO;
import br.urca.dao.DisciplinaDAO;
import br.urca.dao.DisciplinasCursadasDAO;
import br.urca.dao.DisciplinasMatriculadasDAO;
import br.urca.dao.DocumentoEmitidoDAO;
import br.urca.dao.EquivalenciaDAO;
import br.urca.dao.GradeCursoDAO;
import br.urca.dao.HabilitacaoDAO;
import br.urca.dao.HistoricoDAO;
import br.urca.dao.OfertaDAO;
import br.urca.dao.SituacaoDisciplinaDAO;
import br.urca.model.AlunoCurso;
import br.urca.model.Aproveitamento;
import br.urca.model.AtividadeAluno;
import br.urca.model.CoeficienteDeRendimento;
import br.urca.model.CursoTurno;
import br.urca.model.Disciplina;
import br.urca.model.DisciplinaCursada;
import br.urca.model.DisciplinaMatriculada;
import br.urca.model.DocumentoEmitido;
import br.urca.model.DocumentoEmitidoPK;
import br.urca.model.Equivalencia;
import br.urca.model.GradeCurso;
import br.urca.model.GradeCursoPK;
import br.urca.model.Habilitacao;
import br.urca.model.HabilitacaoPK;
import br.urca.model.Historico;
import br.urca.model.HistoricoDisciplina;
import br.urca.model.Oferta;
import br.urca.model.SituacaoDisciplina;
import br.urca.session.UsuarioLogado;
import br.urca.util.ETipoDocumento;

public class HistoricoAluno {
	
	public static final String CURSANDO = "CURSANDO";
	public static final int COM_GRADE = 1;
	public static final int SEM_GRADE = 0;
	
	private DisciplinasCursadasDAO mCursadasDAO;
	private DisciplinasMatriculadasDAO mMatriculadasDAO;
	private DisciplinaDAO mDisciplinaDAO;
	private OfertaDAO mOfertaDAO;
	private AlunosCursoDAO mCursoDAO;
	private DocumentoEmitidoDAO mEmitidosDAO;
	private GradeCursoDAO mGradeCursoDAO;
	private AtividadeAlunoDAO mAtividadeAlunoDAO;
	private HistoricoDAO mHistoricoDAO;
	private AproveitamentoDAO mAproveitamentoDAO;
	private UsuarioLogado mUsuarioLogado;
	private HabilitacaoDAO mHabilitacaoDAO;
	private EquivalenciaDAO mEquivalenciaDAO;
	private SituacaoDisciplinaDAO mSituacaoDisciplinaDAO;
	
	private int totalCredDiscObg = 0;
	private int totalCredEdFisica = 0;
	private int totalPartCompCurr = 0;
	private int totalCredEPB = 0;
	
	private int totalCHObtida = 0;
	private int totalAtivCompObtida = 0;
	
	private List<CoeficienteDeRendimento> mListCR;
	private List<HistoricoDisciplina> mListDisciplinas;
	
	private boolean forReport = true;

	public HistoricoAluno(DisciplinasCursadasDAO mCursadasDAO,
			DisciplinasMatriculadasDAO mMatriculadasDAO,
			HabilitacaoDAO mHabilitacaoDAO, UsuarioLogado mUsuarioLogado, HistoricoDAO mHistoricoDAO,
			AtividadeAlunoDAO mAtividadeAlunoDAO, GradeCursoDAO mGradeCursoDAO,
			DisciplinaDAO mDisciplinaDAO, OfertaDAO mOfertaDAO,
			SituacaoDisciplinaDAO mSituacaoDisciplinaDAO,  AlunosCursoDAO mCursoDAO,
			AproveitamentoDAO mAproveitamentoDAO,
			EquivalenciaDAO mEquivalenciaDAO, DocumentoEmitidoDAO mEmitidosDAO, boolean forReport) {
		this.mCursadasDAO = mCursadasDAO;
		this.mMatriculadasDAO = mMatriculadasDAO;
		this.mDisciplinaDAO = mDisciplinaDAO;
		this.mOfertaDAO = mOfertaDAO;
		this.mCursoDAO = mCursoDAO;
		this.mEmitidosDAO = mEmitidosDAO;
		this.mGradeCursoDAO = mGradeCursoDAO;
		this.mAtividadeAlunoDAO = mAtividadeAlunoDAO;
		this.mHistoricoDAO = mHistoricoDAO;
		this.mAproveitamentoDAO = mAproveitamentoDAO;
		this.mUsuarioLogado = mUsuarioLogado;
		this.mHabilitacaoDAO = mHabilitacaoDAO;
		this.mEquivalenciaDAO = mEquivalenciaDAO;
		this.mSituacaoDisciplinaDAO = mSituacaoDisciplinaDAO;
		this.forReport = forReport;
		
	}
	
	public void processarInformacoesDoAluno(String matricula) {
		
		try {
 			if (matricula != null) {
				
				this.totalCredDiscObg = 0;
				this.totalCredEdFisica = 0;
				this.totalPartCompCurr = 0;
				this.totalCHObtida = 0;
				this.totalAtivCompObtida = 0;
				this.totalCredEPB = 0;
				this.mListDisciplinas = new ArrayList<HistoricoDisciplina>();
				this.mListCR = new ArrayList<CoeficienteDeRendimento>();
				
				//Pega os dados do aluno
				AlunoCurso alunoCurso = mCursoDAO.buscaPorMatricula(matricula);
				
				List<SituacaoDisciplina> listSituacoesValidas = mSituacaoDisciplinaDAO.getPorAcao("1");
				
				this.mListDisciplinas.clear();
				this.mListDisciplinas.addAll(getCursadas(matricula, alunoCurso.getCurso().getCodCurso(), listSituacoesValidas));
				this.mListDisciplinas.addAll(getMatriculadas(matricula, listSituacoesValidas, this.forReport));
				this.mListDisciplinas.addAll(getAproveitamentos(matricula));
				this.mListDisciplinas.addAll(getDisciplinasHistorico(matricula, listSituacoesValidas));
				
				Collections.sort(this.mListDisciplinas, HistoricoDisciplina.POR_OFERTA);
				
				if ((this.mListDisciplinas != null) && (alunoCurso != null)) {
					
					Historico histPratCurrComp = mHistoricoDAO.getPraticasCompCurr(matricula);	
					
					//pega da tabela AtividadesComplementares e da tabela aproveitamentos
					this.totalAtivCompObtida = getTotalAtividadesComp(matricula);
					
					this.totalAtivCompObtida += mHistoricoDAO.getCreditosAtividadesComp(matricula) + this.totalCredEPB;
					
					this.totalCHObtida = ((this.totalCredDiscObg
							+ totalAtivCompObtida + this.totalCredEdFisica +
							+ (histPratCurrComp != null ? histPratCurrComp.getCreditos() : 0)) * 15);
					
					
				}//Fim if
			}//Fim if
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	/*private List<HistoricoDisciplina> getDisciplinasFaltando(
			AlunoCurso alunoCurso, List<HistoricoDisciplina> mListDisciplinas) {
		
		List<HistoricoDisciplina> listRetorno = new ArrayList<HistoricoDisciplina>();
		List<String> discCursadasAprovadas = new ArrayList<String>();
		
		for (HistoricoDisciplina hd: mListDisciplinas) {
			if (!hd.getSituacao().equalsIgnoreCase("AP")
					|| !hd.getSituacao().equalsIgnoreCase("AV")
					|| !hd.getSituacao().equalsIgnoreCase("AE")
					|| !hd.getSituacao().equalsIgnoreCase("CC")
					|| !hd.getSituacao().equalsIgnoreCase("AI")
					|| !hd.getSituacao().equalsIgnoreCase("AC")) {
				discCursadasAprovadas.add(hd.getCodDisciplina());
			}
		}
		
		List<DisciplinaGrade> listDiscGrade = mDisciplinaGradeDAO
				.getListDisciplinasGrade(alunoCurso.getCurso().getCodCurso(),
						alunoCurso.getHabilitacao(), alunoCurso.getGrade(),
						discCursadasAprovadas);				
		
		HistoricoDisciplina hd;
		
		if (listDiscGrade != null && !listDiscGrade.isEmpty()) {
			for (DisciplinaGrade dg: listDiscGrade) {
				hd = new HistoricoDisciplina();
				Disciplina mDisciplina = null;
				mDisciplina = mDisciplinaDAO.buscarPorId(dg.getId().getCodDisciplina());
				hd.setCodDisciplina((dg.getId().getCodDisciplina() != null ? dg.getId().getCodDisciplina() : ""));
				hd.setCreditos(dg.getCredt().toString());
				hd.setCodOferta("99999");
				hd.setCodPedido("");
				hd.setNomeDisciplina(
						(mDisciplina != null ? mDisciplina.getNomeDisciplina() : "" ));
				if (dg.getSemestre().trim().equalsIgnoreCase("99")) {
					hd.setSituacao("OPTATIVA");
				} else {
					hd.setSituacao("OBRIGAT.");
				}	
				listRetorno.add(hd);
			}
		}
		listRetorno = verificaEquivalencias(listRetorno, mListDisciplinas);
		Collections.sort(listRetorno, HistoricoDisciplina.POR_SITUACAO);
		return listRetorno;
	}*/
	
	public List<HistoricoDisciplina> verificaEquivalencias(List<HistoricoDisciplina> listDisciACursar, List<HistoricoDisciplina> listHistorico) {
		
		List<HistoricoDisciplina> listRetorno = new ArrayList<HistoricoDisciplina>();
		
		for (HistoricoDisciplina h: listDisciACursar) {
			List<Equivalencia> equivalencias = mEquivalenciaDAO
					.getListEquivalencia(h.getCodDisciplina());
			boolean adiciona = true;
			if (equivalencias != null && !equivalencias.isEmpty()) {
				for (Equivalencia e: equivalencias) {
					for (HistoricoDisciplina hd: listHistorico) {
						if (e.getId().getCodDisciplinaEquiv().trim()
								.equalsIgnoreCase(hd.getCodDisciplina().trim())) {
							adiciona = false;
							break;	
						}
					}
				}
			}
			if (adiciona) {
				listRetorno.add(h);
			}
		}
		
		return listRetorno;
	}

	private List<HistoricoDisciplina> getDisciplinasHistorico(
			String matricula, List<SituacaoDisciplina> listSituacoesValidas) {
		List<HistoricoDisciplina> listRetorno = new ArrayList<HistoricoDisciplina>();
		List<Historico> mList = mHistoricoDAO.getDiscParaHistorico(matricula);
		AlunoCurso mAlunoCurso = mCursoDAO.buscaPorMatricula(matricula);
		HistoricoDisciplina hd;
		if (mList != null && !mList.isEmpty()) {
			for (Historico h: mList) {
				hd = new HistoricoDisciplina();
				Disciplina mDisciplina = null;
				mDisciplina = mDisciplinaDAO.buscarPorId(h.getId().getCodDisciplina());
				hd.setCodDisciplina((h.getId().getCodDisciplina() != null ? h.getId().getCodDisciplina() : ""));
				hd.setCreditos(h.getCreditos().toString());
				hd.setCodOferta(h.getId().getOferta());
				hd.setCodPedido(h.getPedido());
				hd.setNomeDisciplina(
						(mDisciplina != null ? mDisciplina.getNomeDisciplina() : "" ));
				hd.setNotaAV1(h.getNotaAV1());
				hd.setNotaAV2(h.getNotaAV2());
				hd.setNotaAVF(h.getNotaAVF());
				hd.setMedia(h.getNota());
				if (hd.getCodDisciplina().equalsIgnoreCase("99999")) {
					hd.setSituacao("");					
				} else {
					hd.setSituacao(h.getSituacao().getCodSituacao());
				}	
				if (!hd.getCodDisciplina().trim().equalsIgnoreCase("ED046")  
						&& !hd.getCodDisciplina().trim().equalsIgnoreCase("ED047")
						&& !hd.getCodDisciplina().trim().equalsIgnoreCase("FC089")
						&& !hd.getCodDisciplina().trim().equalsIgnoreCase("EF119")) {
					calculcaCreditosDiscObrig(hd);
				}
				
				//Calcula os total de créditos de educação fisíca
				calculaCreditosEFHistorico(hd, h.getSituacao(), listSituacoesValidas, mAlunoCurso.getCurso().getCodCurso());
				
				listRetorno.add(hd);
			}
		}
		
		return listRetorno;
	}

	private List<HistoricoDisciplina> getAproveitamentos(
			String matricula) {
		
		List<Aproveitamento> mList = mAproveitamentoDAO.getDiscParaHistorico(matricula);
		AlunoCurso mAlunoCurso = mCursoDAO.buscaPorMatricula(matricula);
		List<HistoricoDisciplina> listRetorno = new ArrayList<HistoricoDisciplina>();
		HistoricoDisciplina hd;
		if (mList != null && !mList.isEmpty()) {
			for (Aproveitamento ap: mList) {
				
				hd = new HistoricoDisciplina();
				Disciplina mDisciplina = null;
				mDisciplina = mDisciplinaDAO.buscarPorId(ap.getId().getCodDisciplina());
				
				hd.setCodDisciplina((ap.getId().getCodDisciplina() != null ? ap.getId().getCodDisciplina() : ""));
				hd.setCreditos(String.valueOf(ap.getTotalCreditos()));
				
				hd.setNomeDisciplina(
						(mDisciplina != null ? mDisciplina.getNomeDisciplina() : "" ));
				
				hd.setCodOferta(ap.getOferta());
				if (hd.getCodDisciplina().equalsIgnoreCase("99999")) {
					hd.setSituacao("");					
				} else {
					hd.setSituacao(ap.getTipo());
				}	
				
				if (!hd.getCodDisciplina().trim().equalsIgnoreCase("ED046")  
						&& !hd.getCodDisciplina().trim().equalsIgnoreCase("ED047")
						&& !hd.getCodDisciplina().trim().equalsIgnoreCase("CH025")
						&& !hd.getCodDisciplina().trim().equalsIgnoreCase("DD188")
						&& !hd.getCodDisciplina().trim().equalsIgnoreCase("CH026")
						&& !hd.getCodDisciplina().trim().equalsIgnoreCase("DD189")
						&& !hd.getCodDisciplina().trim().equalsIgnoreCase("FC089")
						&& !hd.getCodDisciplina().trim().equalsIgnoreCase("EF119")) {
					calculcaCreditosDiscObrig(hd);
				}
				
				//Calcula os total de créditos de educação fisíca
				calculaCreditosEFAproveitamento(hd, mAlunoCurso.getCurso().getCodCurso());
				
				listRetorno.add(hd);
			}
		}
		
		return listRetorno;
	}

	public boolean salvarEmissaoDeHistorico(String matricula, String md5) {
		try {
			Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
			DocumentoEmitido doc = new DocumentoEmitido();
	        doc.setId(new DocumentoEmitidoPK(matricula, 
	        		(short) ETipoDocumento.HISTORICO.getTipo(),
	        		calendar.getTime()));
	        doc.setMd5(md5);
	        calendar.add(Calendar.DAY_OF_MONTH, 90);
	        doc.setValidade(calendar.getTime());
	        
	        mEmitidosDAO.salvar(doc);
	        return true;
		} catch(Exception e) {
			return false;
		}
	}
	
	public List<HistoricoDisciplina> getCursadas(String matricula, String codCurso, List<SituacaoDisciplina> listSituacoesValidas) {
		
		HistoricoDisciplina hd = null;
		List<HistoricoDisciplina> mListDisciplinas = new ArrayList<HistoricoDisciplina>(); 
		
		List<DisciplinaCursada> mList = this.mCursadasDAO.getDiscParaHistorico(matricula);
		
		for(DisciplinaCursada d: mList) {
				
			Oferta mOferta = null;
			Disciplina mdDisciplina = null;
			
			mOferta = mOfertaDAO.buscarPorOfertaPedido(
					d.getId().getCodOferta(), d.getId().getCodPedido());
			if (mOferta != null) {
				
				//Calcula os créditos de educação física
				calculaCreditosEFMatriculasHist(mOferta, d.getSituacao(), listSituacoesValidas);
				
				mdDisciplina = mDisciplinaDAO.buscarPorId(mOferta.getCodDisciplina());
			
				hd = new HistoricoDisciplina();
				
				hd.setCodDisciplina((mOferta != null ? mOferta.getCodDisciplina() : ""));
				hd.setCreditos((mOferta != null ? mOferta.getTotalCreditos() : ""));
				
				hd.setNomeDisciplina(
						(mdDisciplina != null ? mdDisciplina.getNomeDisciplina() : "" ));
				
				hd.setCodOferta(d.getId().getCodOferta());
				hd.setCodPedido(d.getId().getCodPedido());	
				
				if (d.getSituacao().getCodSituacao().trim().equalsIgnoreCase("AF")) {
					hd.setMedia(null);
				} else {
					hd.setMedia(d.getMedia());
				}
				
				hd.setNotaAV1(d.getNotaAV1());
				hd.setNotaAV2(d.getNotaAV2());
				hd.setNotaAVF(d.getNotaAVF());
				if (hd.getCodDisciplina().equalsIgnoreCase("99999")) {
					hd.setSituacao("");					
				} else {
					hd.setSituacao((d.getSituacao().getCodSituacao()
							.equalsIgnoreCase("AC") ? CURSANDO : d.getSituacao()
							.getCodSituacao()));
				}
				//Calcula os créditos obtidos das disciplinas obrigatórias
				if (!hd.getCodDisciplina().trim().equalsIgnoreCase("ED046")  
						&& !hd.getCodDisciplina().trim().equalsIgnoreCase("ED047")
						&& !hd.getCodDisciplina().trim().equalsIgnoreCase("CH025")
						&& !hd.getCodDisciplina().trim().equalsIgnoreCase("DD188")
						&& !hd.getCodDisciplina().trim().equalsIgnoreCase("CH026")
						&& !hd.getCodDisciplina().trim().equalsIgnoreCase("DD189")) {
					calculcaCreditosDiscObrig(hd);
				}
					
				
				//Adiciona para o coeficiente de rendimento
				if (d.getSituacao().getCodSituacao().equalsIgnoreCase("AP") 
						|| d.getSituacao().getCodSituacao().equalsIgnoreCase("AV")
						|| d.getSituacao().getCodSituacao().equalsIgnoreCase("RN")
						|| d.getSituacao().getCodSituacao().equalsIgnoreCase("RF")) {
					mListCR.add(new CoeficienteDeRendimento((d.getMedia() != null? d.getMedia() : 0),
							Integer.valueOf((hd.getCreditos() != null ? hd.getCreditos() : "0"))));
				}
				
				mListDisciplinas.add(hd);	
			}
		}
		
		//Atividade complementar da tabela histórico
		/*List<Historico> mListhistAtivComp = mHistoricoDAO.getAtividadesComp(matricula);
		for (Historico histAtivComp: mListhistAtivComp) {
			if (histAtivComp != null) {
				Disciplina mdDisciplina = null;
				hd = new HistoricoDisciplina();
				mdDisciplina = mDisciplinaDAO.buscarPorId(histAtivComp.getId().getCodDisciplina());
			
				hd = new HistoricoDisciplina();
				
				hd.setCodDisciplina(histAtivComp.getId().getCodDisciplina());
				hd.setCreditos(histAtivComp.getCreditos().toString());
				
				hd.setNomeDisciplina(
						(mdDisciplina != null ? mdDisciplina.getNomeDisciplina() : "" ));
				
				hd.setCodOferta(histAtivComp.getId().getOferta());
				hd.setCodPedido("");						
				hd.setMedia(null);
				hd.setNotaAV1(histAtivComp.getNotaAV1());
				hd.setNotaAV2(histAtivComp.getNotaAV2());
				hd.setNotaAVF(histAtivComp.getNotaAVF());
				if (hd.getCodDisciplina().equalsIgnoreCase("99999")) {
					hd.setSituacao("");					
				} else {
					hd.setSituacao(histAtivComp.getSituacao().getCodSituacao());
				}	
				
				mListDisciplinas.add(hd);
				
				try {
					this.totalCredDiscObg += histAtivComp.getCreditos();
				} catch(Exception e) {
					this.totalCredDiscObg += 0;
				}
			}
		}*/
		return mListDisciplinas;
	}
	
	public List<HistoricoDisciplina> getMatriculadas(String matricula, List<SituacaoDisciplina> listSituacoesValidas, boolean forReport) {
		
		HistoricoDisciplina hd = null;
		List<HistoricoDisciplina> mListDisciplinas = new ArrayList<HistoricoDisciplina>(); 
		
		List<DisciplinaMatriculada> mList = this.mMatriculadasDAO.getDiscParaHistorico(matricula);
		
		for(DisciplinaMatriculada d: mList) {
			
			Oferta mOferta = null;
			Disciplina mdDisciplina = null;
			
			mOferta = mOfertaDAO.buscarPorOfertaPedido(
					d.getId().getCodOferta(), d.getId().getCodPedido());
			if (mOferta != null) {
				
				//Calcula os créditos de educação física
				calculaCreditosEFMatriculas(mOferta, d.getSituacao(), listSituacoesValidas);
				
				mdDisciplina = mDisciplinaDAO.buscarPorId(mOferta.getCodDisciplina());
			
				hd = new HistoricoDisciplina();
				
				hd.setCodDisciplina((mOferta != null ? mOferta.getCodDisciplina() : ""));
				hd.setCreditos((mOferta != null ? mOferta.getTotalCreditos() : ""));
				
				hd.setNomeDisciplina(
						(mdDisciplina != null ? mdDisciplina.getNomeDisciplina() : "" ));
				
				hd.setCodOferta(d.getId().getCodOferta());
				hd.setCodPedido(d.getId().getCodPedido());						
				hd.setMedia(d.getMedia());
				hd.setNotaAV1(d.getNotaAV1());
				hd.setNotaAV2(d.getNotaAV2());
				hd.setNotaAVF(d.getNotaAVF());
				
				if (hd.getCodDisciplina().equalsIgnoreCase("99999")) {
					hd.setSituacao("");					
				} else {
					hd.setSituacao((d.getSituacao().getCodSituacao()
							.equalsIgnoreCase("AC") ? CURSANDO : d.getSituacao()
							.getCodSituacao()));
				}
				
				if (!forReport) {
					calculcaCreditosDiscObrigMatriculas(hd);
				}	
				
				//Calcula os créditos obtidos das disciplinas obrigatórias
				if (!hd.getCodDisciplina().trim().equalsIgnoreCase("ED046")  
						&& !hd.getCodDisciplina().trim().equalsIgnoreCase("ED047")
						&& !hd.getCodDisciplina().trim().equalsIgnoreCase("CH025")
						&& !hd.getCodDisciplina().trim().equalsIgnoreCase("DD188")
						&& !hd.getCodDisciplina().trim().equalsIgnoreCase("CH026")
						&& !hd.getCodDisciplina().trim().equalsIgnoreCase("DD189")) {
					calculcaCreditosDiscObrig(hd);
				}
				
				//Adiciona para o coeficiente de rendimento
				if (d.getSituacao().getCodSituacao().equalsIgnoreCase("AP") 
						|| d.getSituacao().getCodSituacao().equalsIgnoreCase("AV")
						|| d.getSituacao().getCodSituacao().equalsIgnoreCase("RN")
						|| d.getSituacao().getCodSituacao().equalsIgnoreCase("RF")) {
					mListCR.add(new CoeficienteDeRendimento((d.getMedia() != null? d.getMedia() : 0),
							Integer.valueOf((hd.getCreditos() != null ? hd.getCreditos() : "0"))));
				}
				
				mListDisciplinas.add(hd);	
			//}
		}
		}
		return mListDisciplinas;
	}
	
	public int getTotalAtividadesComp(String matricula) {
		try {
			int retorno = 0;
			
			List<AtividadeAluno> mList = mAtividadeAlunoDAO.getListComCredito(matricula);
			
			for(AtividadeAluno aa: mList) {
				retorno += aa.getPontuacao();
			}
			
			List<Aproveitamento> mListAproveitamentos = mAproveitamentoDAO.getListByMatricula(matricula);
			if (mListAproveitamentos != null) {
				for(Aproveitamento ap: mListAproveitamentos) {
					
					/*if (!ap.getId().getCodDisciplina().trim().equalsIgnoreCase("ED046")  
							&& !ap.getId().getCodDisciplina().trim().equalsIgnoreCase("ED047")
							&& !ap.getId().getCodDisciplina().trim().equalsIgnoreCase("CH025") 
							&& !ap.getId().getCodDisciplina().trim().equalsIgnoreCase("DD188")
							&& !ap.getId().getCodDisciplina().trim().equalsIgnoreCase("CH026")
							&& !ap.getId().getCodDisciplina().trim().equalsIgnoreCase("DD189")
							&& !ap.getId().getCodDisciplina().trim().equalsIgnoreCase("FC089")
							&& !ap.getId().getCodDisciplina().trim().equalsIgnoreCase("EF119")) {
						this.totalCredDiscObg += ap.getTotalCreditos();
						//retorno += ap.getTotalCreditos();
					}*/
										
					if (ap.getId().getCodDisciplina().equalsIgnoreCase("CH025")  
							|| ap.getId().getCodDisciplina().equalsIgnoreCase("DD188")
							|| ap.getId().getCodDisciplina().equalsIgnoreCase("CH026") 
							|| ap.getId().getCodDisciplina().equalsIgnoreCase("DD189")
							|| ap.getId().getCodDisciplina().equalsIgnoreCase("FC089")) {
						retorno += ap.getTotalCreditos();
					}
					if (ap.getId().getCodDisciplina().equalsIgnoreCase("EF119")) {
						this.totalPartCompCurr += ap.getTotalCreditos();
					}
				}
			}
			
			return retorno;
		}catch(Exception e) {
			return 0;
		}
	}
	
	public void calculaCreditosEFMatriculasHist(Oferta oferta, SituacaoDisciplina situacaoDisciplina, List<SituacaoDisciplina> listSituacoesValidas) {
		
		//Calcular o crédito EPB
		if (oferta.getCodDisciplina().trim().equalsIgnoreCase("CH025")
				|| oferta.getCodDisciplina().trim().equalsIgnoreCase("DD188")
				|| oferta.getCodDisciplina().trim().equalsIgnoreCase("CH026")
				|| oferta.getCodDisciplina().trim().equalsIgnoreCase("DD189")) {
			if (listSituacoesValidas.contains(situacaoDisciplina)) {
				try {
					this.totalCredEPB += Integer.valueOf(oferta.getTotalCreditos());
				} catch (Exception e) {
					this.totalCredEPB += 0;
				}
			}
		}
		
		//Calcular o crédito PCC
		if (oferta.getCodDisciplina().trim().equalsIgnoreCase("EF119")) {
			if (listSituacoesValidas.contains(situacaoDisciplina)) {
				try {
					this.totalPartCompCurr += Integer.valueOf(oferta.getTotalCreditos());
				} catch (Exception e) {
					this.totalPartCompCurr += 0;
				}
			}
		}

		if (oferta.getCodCursoTurno().equalsIgnoreCase("183")
				|| oferta.getCodCursoTurno().equalsIgnoreCase("271")
				|| oferta.getCodCursoTurno().equalsIgnoreCase("272")
				|| oferta.getCodCursoTurno().equalsIgnoreCase("841")
				|| oferta.getCodCursoTurno().equalsIgnoreCase("842")
				|| oferta.getCodCursoTurno().equalsIgnoreCase("833")) {
			return;
		}
		
		if (listSituacoesValidas.contains(situacaoDisciplina)) {
		
			if ((oferta.getCodDisciplina().trim().substring(0, 2).equalsIgnoreCase("EF") && 
					!oferta.getCodDisciplina().trim().equalsIgnoreCase("EF127"))
					|| (oferta.getCodDisciplina().trim().equalsIgnoreCase("ED046") 
							|| oferta.getCodDisciplina().trim().equalsIgnoreCase("ED047"))) {
				try {
					this.totalCredEdFisica += Integer.valueOf(oferta
							.getTotalCreditos());
				} catch (Exception e) {
					this.totalCredEdFisica += 0;
				}
			}
		
		}
	}
	
	public void calculaCreditosEFAproveitamento(HistoricoDisciplina hd, String codCurso) {

		//Calcular o crédito EPB
		if (hd.getCodDisciplina().trim().equalsIgnoreCase("CH025")
				|| hd.getCodDisciplina().trim().equalsIgnoreCase("DD188")
				|| hd.getCodDisciplina().trim().equalsIgnoreCase("CH026")
				|| hd.getCodDisciplina().trim().equalsIgnoreCase("DD189")
				|| hd.getCodDisciplina().trim().equalsIgnoreCase("FC089")) {
			try {
				this.totalCredEPB += Integer.valueOf(hd.getCreditos());
			} catch (Exception e) {
				this.totalCredEPB += 0;
			}
		}
		
		//Calcular o crédito PCC
		if (hd.getCodDisciplina().trim().equalsIgnoreCase("EF119")) {
			try {
				this.totalPartCompCurr += Integer.valueOf(hd.getCreditos());
			} catch (Exception e) {
				this.totalPartCompCurr += 0;
			}
		}
		
		//Calcular crédito de EF
		if (codCurso.equalsIgnoreCase("183")
				|| codCurso.equalsIgnoreCase("271")
				|| codCurso.equalsIgnoreCase("272")
				|| codCurso.equalsIgnoreCase("841")
				|| codCurso.equalsIgnoreCase("842")
				|| codCurso.equalsIgnoreCase("833")) {
			return;
		}
		if ((hd.getCodDisciplina().trim().substring(0, 2).equalsIgnoreCase("EF"))
				|| (hd.getCodDisciplina().trim().equalsIgnoreCase("ED046") 
						|| hd.getCodDisciplina().trim().equalsIgnoreCase("ED047"))) {
			try {
				this.totalCredEdFisica += Integer.valueOf(hd.getCreditos());
			} catch (Exception e) {
				this.totalCredEdFisica += 0;
			}
		}
	}
	
	public void calculaCreditosEFHistorico(HistoricoDisciplina hd, SituacaoDisciplina situacaoDisciplina, List<SituacaoDisciplina> listSituacoesValidas, String codCurso) {
		
		//Calcular o crédito EPB
		if (hd.getCodDisciplina().trim().equalsIgnoreCase("FC089")) {
			if (listSituacoesValidas.contains(situacaoDisciplina)) {
				try {
					this.totalCredEPB += Integer.valueOf(hd.getCreditos());
				} catch (Exception e) {
					this.totalCredEPB += 0;
				}
			}
		}
		
		//Calcular o crédito PCC
		if (hd.getCodDisciplina().trim().equalsIgnoreCase("EF119")) {
			if (listSituacoesValidas.contains(situacaoDisciplina)) {
				try {
					this.totalPartCompCurr += Integer.valueOf(hd.getCreditos());
				} catch (Exception e) {
					this.totalPartCompCurr += 0;
				}
			}
		}

		if (codCurso.equalsIgnoreCase("183")
				|| codCurso.equalsIgnoreCase("271")
				|| codCurso.equalsIgnoreCase("272")
				|| codCurso.equalsIgnoreCase("841")
				|| codCurso.equalsIgnoreCase("842")
				|| codCurso.equalsIgnoreCase("833")) {
			return;
		}
		if (listSituacoesValidas.contains(situacaoDisciplina)) {
			if ((hd.getCodDisciplina().trim().substring(0, 2).equalsIgnoreCase("XX"))
					|| (hd.getCodDisciplina().trim().equalsIgnoreCase("ED046") 
							|| hd.getCodDisciplina().trim().equalsIgnoreCase("ED047"))) {
				try {
					this.totalCredEdFisica += Integer.valueOf(hd.getCreditos());
				} catch (Exception e) {
					this.totalCredEdFisica += 0;
				}
			}
		}
	}
	
	public void calculaCreditosEFMatriculas(Oferta oferta, SituacaoDisciplina situacaoDisciplina, List<SituacaoDisciplina> listSituacoesValidas) {
		
		//Calcular o crédito EPB
		if (oferta.getCodDisciplina().trim().equalsIgnoreCase("CH025") 
				|| oferta.getCodDisciplina().trim().equalsIgnoreCase("DD188")
				|| oferta.getCodDisciplina().trim().equalsIgnoreCase("CH026")
				|| oferta.getCodDisciplina().trim().equalsIgnoreCase("DD189")) {
			if (listSituacoesValidas.contains(situacaoDisciplina)) {
				try {
					this.totalCredEPB += Integer.valueOf(oferta.getTotalCreditos());
				} catch (Exception e) {
					this.totalCredEPB += 0;
				}
			}
		}
		
		//Calcular o crédito PCC
		if (oferta.getCodDisciplina().trim().equalsIgnoreCase("EF119")) {
			if (listSituacoesValidas.contains(situacaoDisciplina)) {
				try {
					this.totalPartCompCurr += Integer.valueOf(oferta.getTotalCreditos());
				} catch (Exception e) {
					this.totalPartCompCurr += 0;
				}
			}
		}

		if (oferta.getCodCursoTurno().equalsIgnoreCase("183")
				|| oferta.getCodCursoTurno().equalsIgnoreCase("271")
				|| oferta.getCodCursoTurno().equalsIgnoreCase("272")
				|| oferta.getCodCursoTurno().equalsIgnoreCase("833")
				|| oferta.getCodCursoTurno().equalsIgnoreCase("841")
				|| oferta.getCodCursoTurno().equalsIgnoreCase("842")) {
			return;
		}
		if (listSituacoesValidas.contains(situacaoDisciplina)) {
			if ((oferta.getCodDisciplina().substring(0, 2).equalsIgnoreCase("EF")) 
					|| (oferta.getCodDisciplina().trim().equalsIgnoreCase("ED046") 
							|| oferta.getCodDisciplina().trim().equalsIgnoreCase("ED047"))) {
				try {
					this.totalCredEdFisica += Integer.valueOf(oferta
							.getTotalCreditos());
				} catch (Exception e) {
					this.totalCredEdFisica += 0;
				}
			}
		}
	}
	
	public void calculcaCreditosDiscObrigMatriculas(HistoricoDisciplina hd) {
		if (hd.getSituacao().equalsIgnoreCase("AP")
				|| hd.getSituacao().equalsIgnoreCase("AV")
				|| hd.getSituacao().equalsIgnoreCase("CURSANDO")
				|| hd.getSituacao().equalsIgnoreCase("AE")
				|| hd.getSituacao().equalsIgnoreCase("CC")
				|| hd.getSituacao().equalsIgnoreCase("AI")) {
			try {
				this.totalCredDiscObg += Integer.valueOf(hd.getCreditos());
			} catch(Exception e) {
				this.totalCredDiscObg += 0;
			}
		}
	}
	
	public void calculcaCreditosDiscObrig(HistoricoDisciplina hd) {
		if (hd.getSituacao().equalsIgnoreCase("AP")
				|| hd.getSituacao().equalsIgnoreCase("AV")
				|| hd.getSituacao().equalsIgnoreCase("AE")
				|| hd.getSituacao().equalsIgnoreCase("CC")
				|| hd.getSituacao().equalsIgnoreCase("AI")) {
			try {
				this.totalCredDiscObg += Integer.valueOf(hd.getCreditos());
			} catch(Exception e) {
				this.totalCredDiscObg += 0;
			}
		}
	}
	
	public String getCoeficienteRendimento(String matricula) {
		
		double retorno = 0;
		double totalMedia = 0;
		double totalCredito = 0;
	
		List<Historico> mHistoricos = mHistoricoDAO.getHistoricoParaCR(matricula);
	
		for (CoeficienteDeRendimento cr: mListCR) {
			totalCredito += cr.getTotalCredito();
			totalMedia += cr.getMedia() * cr.getTotalCredito();
		}
		
		if (mHistoricos != null) {
			for (Historico h: mHistoricos) {
				if (h.getNota() != null && h.getCreditos() != null) {
					totalCredito += h.getCreditos();
					totalMedia += h.getNota() * h.getCreditos();
				}
			}
		}
		String rendimento = "--";
		if (totalMedia > 0 && totalCredito > 0) {
			retorno = totalMedia / totalCredito;
			rendimento = String.valueOf(retorno);
			rendimento = rendimento.substring(0, rendimento.indexOf(".") + 2);
		}
		return rendimento;
	}
	
	public String getHabilitacaoAluno(HabilitacaoPK id) {	
		String retorno = "";
		Habilitacao habilitacao = mHabilitacaoDAO.buscarPorId(id);
		if (habilitacao != null && habilitacao.getDescricao() != null) {
			switch (habilitacao.getDescricao().substring(0, 8)) {
			case "BACHAREL":
				retorno = "Bacharelado em ";
				break;
			case "ENGENHEI":
				retorno = "Bacharelado em ";
				break;		
			case "TECNOLOG":
				retorno = "Tecnólogo em ";
				break;
			case "MESTRADO":
				retorno = "Mestrado em ";
				break;	
			case "FORMAÇÃO":
				retorno = "Sequencial de ";
				break;	
			default:
				retorno = "Licenciatura em ";
				break;
			}
		}
		return retorno;
	}
	
	public String getDescricaoTurno(CursoTurno ct) {
		String retorno = "NÃO DEFINIDO";
		if (ct != null) {
			switch (ct.getTurno().trim()) {
			case "M":
				retorno = "Manhã";
				break;
			case "M/T":
				retorno = "Manhã/Tarde";
				break;	
			case "MTN":
				retorno = "Manhã/Tarde/Noite";
				break;		
			case "T":
				retorno = "Tarde";
				break;	
			case "N":
				retorno = "Noite";
				break;				
			default:
				retorno = "Não Definido";
				break;
			}
		}
		return retorno;	
	}
	
	/*public boolean isEligibleGraduation() {

		try {

			GradeCurso gradeCurso = mGradeCursoDAO
					.getGradePorId(new GradeCursoPK(mUsuarioLogado.getAluno()
							.getCurso().getCodCurso(), mUsuarioLogado
							.getAluno().getHabilitacao(), mUsuarioLogado
							.getAluno().getGrade(), mUsuarioLogado.getAluno()
							.getTurma()));

			// Calculando total de horas exigidas
			int totalCHExigida = ((gradeCurso.getTotalCreditos() * 15)
					+ (gradeCurso.getTotalCredAtivCompl() * 15) + (gradeCurso
					.getTotalCredPraticaCompCurr() * 15));

			return this.totalCHObtida >= totalCHExigida;

		} catch (Exception e) {
			return false;
		}
	}*/
	
	/***************** GETTERS ******************/
	public int getTotalCredDiscObg() {
		return totalCredDiscObg;
	}

	public int getTotalCredEdFisica() {
		return totalCredEdFisica;
	}

	public int getTotalPartCompCurr() {
		return totalPartCompCurr;
	}

	public int getTotalCHObtida() {
		return totalCHObtida;
	}

	public int getTotalAtivCompObtida() {
		return totalAtivCompObtida;
	}

	public List<CoeficienteDeRendimento> getListCoeficienteRendimento() {
		return mListCR;
	}

	public List<HistoricoDisciplina> getListDisciplinas() {
		return mListDisciplinas;
	}
	

}
